home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / Snippets / Devices / ReadSector MSDOS / ReadSectorMSDOS.p < prev    next >
Encoding:
Text File  |  1992-07-15  |  3.5 KB  |  156 lines  |  [TEXT/PJMM]

  1. program ReadSectorMSDOS;  { quick & dirty, with Think Pascal's built-in Writeln window.  Joseph Maurer, January 1992 }
  2.     const
  3.         cDriveNum = 1;  { internal drive }
  4.         cSectorSize = 512;
  5.         cSectorsPerTrack = 9;  { or 18, for HD disks }
  6.         cSides = 2;  { double-sided only, for now }
  7.  
  8.     var
  9.         gSectBuffer: Ptr;
  10.  
  11.     procedure BailOut (msg: Str255; err: Integer);
  12.     begin
  13.         if err <> 0 then
  14.             Writeln(msg, ' (', err : 6, ')')
  15.         else
  16.             Writeln(msg);
  17.         Writeln('(click mouse to quit)');
  18.         SysBeep(20);
  19.         repeat
  20.         until Button;
  21.         err := Eject(nil, cDriveNum);
  22.         ExitToShell;
  23.     end;
  24.  
  25.     procedure Initialize;
  26.         var
  27.             r: Rect;
  28.     begin
  29.         SetRect(r, 10, 50, 460, 300);
  30.         SetTextRect(r);
  31.         ShowText;
  32.         gSectBuffer := NewPtr(cSectorSize);
  33.         if gSectBuffer = nil then
  34.             BailOut('not enough memory ', MemError);
  35.     end;
  36.  
  37.     function FloppyInserted (drive: Integer): Boolean;
  38.         var
  39.             volumeName: Str255;
  40.             vRefNum: Integer;
  41.             freeBytes: Longint;
  42.             err: OsErr;
  43.             evt: EventRecord;
  44.             endRepeat: Boolean;
  45.     begin
  46.         err := Eject(nil, drive);  { make clear something will happen to the drive }
  47.         repeat
  48.             volumeName := '?';
  49.             err := GetVinfo(drive, @volumeName, vRefnum, freeBytes);
  50.             if err = nsvErr then  { no such volume }
  51.                 begin
  52.                     SysBeep(20);
  53.                     Writeln('insert floppy in the internal drive');
  54.                     Writeln('(if you have a SuperDrive , even an MS - DOS one !) ');
  55.                     Writeln('or click the mouse to quit');
  56.                     Writeln;
  57.                     endRepeat := false;
  58.                     repeat
  59.                         if GetNextEvent(everyEvent, evt) then
  60.                             endRepeat := (evt.what in [mouseDown, diskEvt]);
  61.                     until endRepeat;
  62.                     if evt.what = mouseDown then
  63.                         begin
  64.                             err := Eject(nil, drive);  { for convenience, just in case }
  65.                             ExitToShell;
  66.                         end
  67.                     else
  68.                         err := BitShift(evt.message, -16);  { is currently "extFSErr" for MS-DOS floppies }
  69.                 end;
  70.         until err <> nsvErr;
  71.         FloppyInserted := (err <> nsvErr);  { should be more careful here! }
  72.     end;
  73.  
  74.     procedure ReadSector (t, f, n: Integer; p: Ptr);
  75. { read sector <n> on face <f> of track <t> into buffer <p> }
  76.         var
  77.             paramBlock: ParamBlockRec;
  78.             trackSize: Longint;
  79.             err: OsErr;
  80.     begin
  81.         trackSize := cSectorSize * cSectorsPerTrack;
  82.         with paramBlock do
  83.             begin
  84.                 ioCompletion := nil;
  85.                 ioVRefnum := cDriveNum;
  86.                 ioRefnum := -5;
  87.                 ioBuffer := p;
  88.                 ioReqCount := cSectorSize;
  89.                 ioPosMode := fsFromStart;
  90.                 ioPosOffset := trackSize * (cSides * t + f) + cSectorSize * n;
  91.             end;
  92.         err := PBRead(@paramBlock, FALSE);
  93.         if err <> noErr then
  94.             BailOut('PBRead returns ', err);
  95.     end;
  96.  
  97.     procedure DisplaySector (t, f, n: Integer; p: Ptr);
  98.         var
  99.             i: Integer;
  100.             c: Char;
  101.             p0: Ptr;
  102.  
  103.         function Hex (b: SignedByte): Str255;
  104.             var
  105.                 hx: string[16];
  106.                 s: str255;
  107.         begin
  108.             s := 'xx';
  109.             hx := '0123456789ABCDEF';
  110.             s[1] := hx[1 + BitAnd(BitShift(b, -4), $0F)];
  111.             s[2] := hx[1 + BitAnd(b, $0F)];
  112.             Hex := s;
  113.         end;
  114.  
  115.     begin
  116.         p0 := p;
  117.         Writeln('Track ', t : 2, '  -- face ', f : 1, ' -- sector ', n : 2, ' (first 16 bytes):');
  118.         for i := 0 to 15 do
  119.             begin
  120.                 Write(Hex(p^), ' ');
  121.                 p := Ptr(Longint(p) + 1);
  122.             end;
  123.         Write('   ');
  124.         p := p0;
  125.         for i := 0 to 15 do
  126.             begin
  127.                 c := chr(p^);
  128.                 if ord(c) > 31 then
  129.                     Write(c)
  130.                 else
  131.                     Write('.');
  132.                 p := Ptr(Longint(p) + 1);
  133.             end;
  134.         Writeln;
  135.         Writeln;
  136.     end;
  137.  
  138.     procedure DemoTime;
  139.         var
  140.             track: 0..79;
  141.             side: 0..1;
  142.             sector: 0..8;  { cSectorsPerTrack - 1 }
  143.     begin
  144.         track := 0;
  145.         side := 0;
  146.         sector := 0;
  147.         ReadSector(track, side, sector, gSectBuffer);
  148.         DisplaySector(track, side, sector, gSectBuffer);
  149.         BailOut('That''s all folks', 0);
  150.     end;
  151.  
  152. begin
  153.     Initialize;
  154.     if FloppyInserted(cDriveNum) then
  155.         DemoTime;
  156. end.